//1, 字面量
let a: 10;

a = 10
// a=11; //错了 只能赋值字面量中的值


// 可以使用 | 来连接多个类型(联合类型)
let b: 'male' | 'female';
b = 'male';
b = 'female';

let y: boolean | string;
y = true;
y = 'true';


//2, any: 表示的是任意类型 相当于对该变量关闭了TS的类型检测
//使用TS时，不建议使用any类型
let e: any;
e = 10;
e = 'string';
e = true

//声明变量如果不指定类型，则TS解析器 会自动判断变量的类型为any (隐式的any)
let g;
g = 10;
g = 'string'
g = false;


//3, unknown 表示位置类型  类型安全的any
let h: unknown;
h = 10;
h = false;
h = '10';

let s: string;

// s = e; // any类型可以赋值给任何类型（祸害自己也害别人）

// s = h; //错了 unknown类型只能祸害自己，不能将类型“unknown”分配给其他类型

// 解决办法一:判断类型
if (typeof h === 'string') {
   s = h;
}
// 办法二：类型断言，可以用来告诉解析器变量的实际类型
/*
语法:(两种写法)
1,变量 as 类型
2,<类型>变量
*/

s = h as string;
s = <string>h


//4, void用来表示空，以函数为例，就表示没有返回值的两数
function fn(): void {

   console.log(123);
   return undefined
   // return false //错
}



//5, never  不能是任何值(了解)
function error(message: string): never {
   throw new Error(message);
}